home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 3 / Cream of the Crop 3.iso / comm / wnos5src.zip / NRHDR.C < prev    next >
Text File  |  1993-08-09  |  3KB  |  136 lines

  1. /* Functions for level 3 net/rom support */
  2. #include "global.h"
  3. #include "config.h"
  4. #ifdef NETROM
  5. #include "mbuf.h"
  6. #include "timer.h"
  7. #include "ax25.h"
  8. #include "netrom.h"
  9. #include <ctype.h>
  10.  
  11. /* Convert a net/rom network header to host format structure
  12.  * Return -1 if error, 0 if OK
  13.  */
  14.  
  15. int
  16. ntohnr3(hdr,bpp)
  17. struct nr3hdr *hdr ;    /* output structure */
  18. struct mbuf **bpp ;
  19. {
  20.     int ttl ;
  21.  
  22.     if (pullup(bpp,hdr->source,AXALEN) < AXALEN)
  23.         return -1 ;
  24.  
  25.     if (pullup(bpp,hdr->dest,AXALEN) < AXALEN)
  26.         return -1 ;
  27.  
  28.     if ((ttl = PULLCHAR(bpp)) == -1)
  29.         return -1 ;
  30.  
  31.     hdr->ttl = ttl;
  32.  
  33.     return 0 ;
  34. }
  35.  
  36. /* Convert a host-format net/rom level 3 header into an mbuf ready
  37.  * for transmission.
  38.  */
  39.  
  40. struct mbuf *
  41. htonnr3(hdr)
  42. struct nr3hdr *hdr;
  43. {
  44.     struct mbuf *rbuf ;
  45.     char *cp ;
  46.  
  47.     if (hdr == (struct nr3hdr *) NULL)
  48.         return NULLBUF ;
  49.  
  50.     /* Allocate space for return buffer */
  51.     rbuf = alloc_mbuf(NR3HLEN);
  52.  
  53.     rbuf->cnt = NR3HLEN ;
  54.  
  55.     /* Now convert */
  56.     cp = rbuf->data ;
  57.  
  58.     memcpy(cp,hdr->source,AXALEN);
  59.     cp[ALEN] &= ~E ;    /* source E-bit is always off */
  60.     cp += AXALEN;
  61.     memcpy(cp,hdr->dest,AXALEN);
  62.     cp[ALEN] |= E ;        /* destination E-bit always set */
  63.     cp += AXALEN;
  64.     *cp = hdr->ttl ;
  65.  
  66.     return rbuf ;
  67. }
  68.  
  69. /* Convert a net/rom routing broadcast destination subpacket from
  70.  * network format to a host format structure.  Return -1 if error,
  71.  * 0 if OK.
  72.  */
  73. int
  74. ntohnrdest(ds,bpp)
  75. struct nr3dest *ds ;
  76. struct mbuf **bpp ;
  77. {
  78.     int quality ;
  79.  
  80.     /* get destination callsign */
  81.     if (pullup(bpp,ds->dest,AXALEN) < AXALEN)
  82.         return -1 ;
  83.  
  84.     /* get destination alias */
  85.     if (pullup(bpp,ds->alias,ALEN) < ALEN)
  86.         return -1 ;
  87.     ds->alias[ALEN] = '\0' ;
  88.  
  89.     /* get best neighbor callsign */
  90.     if (pullup(bpp,ds->neighbor,AXALEN) < AXALEN)
  91.         return -1 ;
  92.  
  93.     /* get route quality */
  94.     if ((quality = PULLCHAR(bpp)) == -1)
  95.         return -1 ;
  96.     ds->quality = uchar(quality) ;
  97.  
  98.     return 0 ;
  99. }
  100.  
  101. /* Convert a host-format net/rom destination subpacket into an
  102.  * mbuf ready for transmission as part of a route broadcast
  103.  * packet.
  104.  */
  105. struct mbuf *
  106. htonnrdest(ds)
  107. struct nr3dest *ds ;
  108. {
  109.     struct mbuf *rbuf ;
  110.     char *cp ;
  111.  
  112.     if (ds == (struct nr3dest *) NULL)
  113.         return NULLBUF ;
  114.  
  115.     /* Allocate space for return buffer */
  116.     rbuf = alloc_mbuf(NRRTDESTLEN);
  117.  
  118.     rbuf->cnt = NRRTDESTLEN ;
  119.  
  120.     cp = rbuf->data ;
  121.  
  122.     memcpy(cp,ds->dest,AXALEN) ;
  123.     cp += AXALEN;
  124.  
  125.     memcpy(cp,ds->alias,ALEN) ;
  126.     cp += ALEN ;
  127.  
  128.     memcpy(cp,ds->neighbor,AXALEN) ;
  129.     cp += AXALEN;
  130.  
  131.     *cp = uchar(ds->quality) ;
  132.  
  133.     return rbuf ;
  134. }
  135.  
  136. #endif /* NETROM */